home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / dskut / adjram41.zip / AMDISK.ASM < prev    next >
Assembly Source File  |  1988-05-15  |  33KB  |  1,165 lines

  1. ; ==== Adjustable Memory Disk Device Driver ====
  2. ;
  3. ; (c) Copyright 1986,1987,1988 by Gary R. Cramblitt
  4. ;
  5. ; v2.2  1 Jul 86  Initial version
  6. ; v2.3 24 Aug 86  Bug.  FAT media byte not updated properly
  7. ; v2.4 29 Aug 86  Sync version # with ADJRAM.C  No other changes.
  8. ; v2.5 30 Aug 86  Add /E (LOTUS/INTEL,Microsoft Expanded Memory) support;
  9. ;          Increase root directory to 128 entries;
  10. ;          Permit maximum size of 2043K.
  11. ;          Get rid of second FAT.
  12. ; v3.0  5 Sep 86  Sync version # with ADJRAM.C.  No other changes.
  13. ; v3.1  2 Oct 86  Sync version # with ADJRAM.C.  No other changes.
  14. ; v3.2 18 Oct 86  Add SIZE= option
  15. ; v4.0  3 Jan 87  Chg SIZE= to MINSIZE=
  16. ;          Add support for reserved conventional memory.
  17. ;          Add CLUSTER= option.
  18. ;          Allow for expanded memory blocks larger than 64K.
  19. ;          Use legal FAT ID.  CHKDSK now happy with memory disk, and
  20. ;            occasional DOS "FAT error" prevented.
  21. ;          Add volume label to memory disk.
  22. ; v4.1 15 May 88  Restrict reserved memory to A segment or above.
  23. ;                 Initialize reserved memory.
  24. ;
  25. ; ==== Constant Definition ===================
  26. ;
  27. ; ---- Customizable Definitions -----
  28. ;      If these are changed, the corresponding symbols in adjram.c
  29. ;      must be altered.
  30.  
  31. def_size_K    equ    64        ; default 64K ram disk
  32. max_isize_K    equ    512        ; maximum 512K initial ram disk size
  33. cnv_sec_per_blk    equ    64        ; 32K increments in conventional mem
  34. max_clusters    equ    4086        ; max clusters per disk
  35.                                         ;   (12-bit FAT entries)
  36. bytes_per_sec    equ    512        ; bytes per sector
  37. def_sec_per_cl    equ    1        ; default sectors per cluster
  38. par_per_sec_lg2    equ    5        ; 16-byte paragraphs per sector
  39.                     ;   log 2.  Must match bytes_per_sec
  40. fats_per_disk    equ    1        ; number of FATS
  41.  
  42. ; ---- Derived quantities ----
  43.  
  44. max_mem_blks    equ    (max_clusters/cnv_sec_per_blk)
  45.                     ; Maximum number of memory blocks
  46.                     ;   assuming cluster size of 1
  47. sec_per_K    equ    1024/bytes_per_sec ; sectors per 1024 bytes
  48. sec_per_K_lg2    equ    1        ; must match above parameter
  49. par_per_sec    equ    bytes_per_sec/16   ; 16-byte paragraphs per sector
  50. def_size_sec    equ    def_size_K*sec_per_K ; default size in sectors
  51. bytes_per_fat    equ    max_clusters*3/2
  52. sec_per_fat    equ    (bytes_per_fat+bytes_per_sec-1)/bytes_per_sec
  53.  
  54. sec_per_em_pag    equ    16*sec_per_K    ; sectors per expanded mem page
  55. sec_per_em_pag_lg2 equ    5        ; sectors per em page log 2, must
  56.                     ;   match above parameter
  57. sec_per_em_pag_msk equ    sec_per_em_pag-1
  58.  
  59. ; ---- Static Request Header Structure Definitions ----
  60.  
  61. srh_length    equ    0        ; (byte) length field
  62. srh_unit    equ    1 + srh_length    ; (byte) unit field
  63. srh_command    equ    1 + srh_unit    ; (byte) command code
  64. srh_status    equ    1 + srh_command    ; (word) status field
  65. srh_reserved    equ    2 + srh_status    ; (8 bytes)
  66. srh_size    equ    8 + srh_reserved ; request header size
  67.  
  68. ; ---- Request Header Status values ----
  69.  
  70. s_done        equ    0100h    ; done, no errors
  71. s_busy        equ    0200h    ; busy, no errors
  72.  
  73. e_err        equ    8000h
  74. e_protect    equ    e_err+0h    ; error: write protect
  75. e_unknown_unit    equ    e_err+1h    ; error: unknown unit
  76. e_not_ready    equ    e_err+2h    ; error: not ready
  77. e_command    equ    e_err+3h    ; error: unknown command
  78. e_crc        equ    e_err+4h    ; error: bad CRC
  79. e_bad_length    equ    e_err+5h    ; error: bad structure length
  80. e_seek        equ    e_err+6h    ; error: bad seek
  81. e_media        equ    e_err+7h    ; error: unknown media
  82. e_not_found    equ    e_err+8h    ; error: sector not found
  83. e_paper        equ    e_err+9h    ; error: out of paper
  84. e_write        equ    e_err+ah    ; error: write fault
  85. e_read        equ    e_err+bh    ; error: read fault
  86. e_general    equ    e_err+ch    ; error: general error not listed above
  87.  
  88. ; ---- Non-destructive read parameter block ----
  89.  
  90. rh_read_data    equ    srh_size    ; (byte) non-destructive data
  91.  
  92. ; ---- Input/output parameter block ----
  93.  
  94. rh_media    equ    0 + srh_size        ; (byte) media descriptor
  95. rh_buf_offset    equ    1 + rh_media        ; (word) transfer buffer offset
  96. rh_buf_segment    equ    2 + rh_buf_offset    ; (word) transfer buffer segment
  97. rh_buf_size    equ    2 + rh_buf_segment    ; (word) transfer buffer size
  98. rh_start    equ    2 + rh_buf_size        ; (word) transfer starting sector
  99.  
  100. m_fixed        equ    0f8h    ; media: fixed disk
  101.  
  102. m_ss9        equ    0fch    ; media: single sided, 8 sectors/track
  103. m_ds9        equ    0fdh
  104. m_ss8        equ    0feh
  105. m_ds8        equ    0ffh
  106.  
  107. ; ---- Build BPB parameter block ----
  108.                         ; preceeded by media descriptor
  109. rh_bpb        equ    1 + rh_media        ; (dword) bpb buffer address
  110. rh_tbl_offset    equ    4 + rh_bpb        ; (dword) bpb table offset/segment
  111. rh_tbl_segment    equ    2 + rh_tbl_offset
  112.  
  113. ; ---- Media Check parameter block ----
  114.  
  115. rh_check    equ    1 + rh_media        ; (byte) media check result
  116.  
  117. mc_changed    equ    -1            ; media has changed
  118. mc_maybe    equ    0            ; media may have been changed
  119. mc_same        equ    1            ; media has not changed
  120.  
  121. ; ---- Initialize parameter block ----
  122.  
  123. rh_units    equ    0 + srh_size        ; (byte) number of units supported
  124. rh_end_offset    equ    1 + rh_units        ; (word) end address of driver
  125. rh_end_segment    equ    2 + rh_end_offset
  126. rh_bpb_offset    equ    2 + rh_end_segment    ; (word) BPB array address
  127. rh_bpb_segment    equ    2 + rh_bpb_offset
  128. rh_cmd_offset    equ    rh_bpb_offset        ; (word) "device=" cmd line
  129. rh_cmd_segment    equ    rh_bpb_segment
  130. rh_cmd        equ    rh_bpb_offset
  131.  
  132. ; ---- DOS interrupts ----
  133.  
  134. dosi_dosf    equ    21h        ; DOS function dispatcher
  135.  
  136. ; ---- User Interrupts ----
  137.  
  138. usri_emm    equ    67h        ; Expanded Memory Manager
  139.  
  140. ; ---- DOS interrupt 21 functions ----
  141.  
  142. dosf_outstr    equ    9        ; display string
  143. dosf_seldisk    equ    0eh        ; select disk
  144. dosf_getdisk    equ    19h        ; get current disk
  145.  
  146. ; ---- LOTUS/INTEL/Microsoft Expanded Memory Manager functions ----
  147.  
  148. emm_status    equ    40h        ; get manager status
  149. emm_get_PFseg    equ    41h        ; get page frame segment
  150. emm_get_pages    equ    42h        ; get number of pages
  151. emm_get_handle    equ    43h        ; get handle and allocate memory
  152. emm_map_memory    equ    44h        ; map memory
  153. emm_fre_handle    equ    45h        ; free handle and memory
  154. emm_get_ver    equ    46h        ; get EMM version
  155. emm_sav_map    equ    47h        ; save mapping context
  156. emm_res_map    equ    48h        ; restore mapping context
  157. emm_num_handles    equ    4bh        ; get number of EMM handles
  158. emm_hdl_pages    equ    4ch        ; get pages owned by handle
  159. emm_all_pages    equ    4dh        ; get pages for all handles
  160. emm_pag_map    equ    4eh        ; get or set page map
  161.  
  162. ; ---- Device Driver Header Attribute Definitions ----
  163.  
  164. a_input        equ    0001h        ; standard input device
  165. a_output    equ    0002h        ; standard output device
  166. a_nul        equ    0004h        ; NUL device
  167. a_clock        equ    0008h        ; CLOCK$ device
  168. a_ibm        equ    0        ; IBM block device (bit 13)
  169. a_not_ibm    equ    2000h        ; non-IBM block device (bit 13)
  170. a_ioctl        equ    4000h        ; IOCTL functions supported
  171. a_block        equ    0        ; block device (bit 15)
  172. a_character    equ    8000h        ; character device (bit 15)
  173.  
  174. ; ---- FAT IDs ----
  175.  
  176. fid_fix        equ    0f8h        ; fixed disk
  177. fid_ds15    equ    0f9h        ; double-sided, 15 sector
  178. fid_ss9        equ    0fch        ; single-sided, 9 sector
  179. fid_ds9        equ    0fdh        ; double-sided, 9 sector
  180. fid_ss8        equ    0feh        ; single-sided, 8 sector
  181. fid_ds8        equ    0ffh        ; double-sided, 8 sector
  182. fid_ss8sd    equ    0feh        ; single-sided, 8 inch, single dens
  183. fid_ss8sd_alt    equ    0fdh        ; alternate sssd 8 inch
  184. fid_ds8dd    equ    0feh        ; double-side, 8 inch, double-dens
  185.  
  186. ; ---- Character Codes ----
  187.  
  188. cc_ht        equ    9        ; TAB
  189. cc_cr        equ    13
  190. cc_lf        equ    10
  191. cc_sp        equ    ' '
  192. cc_bel        equ    7
  193.  
  194. ; ==== Device Driver Header Definition ====
  195.  
  196. cseg    segment para public 'CODE'
  197.  
  198. driver    proc far
  199.  
  200.     assume cs:cseg,ds:cseg,es:cseg
  201.  
  202.     dd    -1            ; last driver in chain
  203.     dw    a_block + a_not_ibm    ; driver attribute
  204.     dw    dev_strategy        ; offset to strategy routine
  205.     dw    dev_interrupt        ; offset to interrupt routine
  206.     db    1            ; number of devices or device name
  207.     db    7 dup ( ? )        ; filler for block device
  208.  
  209. ; ==== Device Driver Tables ====
  210. ;
  211. ; ---- BIOS Parameter Block Table and Entries ----
  212.  
  213. bpb_table    dw    bpb        ; one entry for each unit
  214.  
  215. ; ---- Request Header Address set by dev_strategy ----
  216.  
  217. rh_address    dd    1 dup ( ? )        ; request header base address
  218.  
  219. rh_offset    equ    word ptr rh_address
  220. rh_segment    equ    word ptr rh_address + 2
  221.  
  222. ; ---- Request Header Command Dispatch Table ----
  223.  
  224. cmd_table    dw    initialize    ; initialize driver
  225.         dw    media_check    ; media check
  226.         dw    build_bpb    ; build BPB
  227.         dw    ioctl_read    ; IOCTL read
  228.         dw    read        ; normal read
  229.         dw    check_input    ; non-destructive read/status
  230.         dw    input_status    ; input status
  231.         dw    i